home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / TDMouse-1.1os.lha / TDMouse / TDMouse.c < prev    next >
C/C++ Source or Header  |  2000-10-13  |  13KB  |  514 lines

  1. /*
  2. // ##########################################################################
  3. // ####                                                                  ####
  4. // ####           TDMouse - A serial mouse driver for the Amiga          ####
  5. // ####          ===============================================         ####
  6. // ####                                                                  ####
  7. // #### TDMouse.c                                                        ####
  8. // ####                                                                  ####
  9. // #### Version 1.10  --  October 13, 2000                               ####
  10. // ####                                                                  ####
  11. // #### Copyright (C) 1995  Thomas Dreibholz                             ####
  12. // ####                     Molbachweg 7                                 ####
  13. // ####                     51674 Wiehl/Germany                          ####
  14. // ####                     EMail: Dreibholz@bigfoot.com                 ####
  15. // ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
  16. // ####                                                                  ####
  17. // ##########################################################################
  18. */
  19. /***************************************************************************
  20.  *                                                                         *
  21.  *   This program is free software; you can redistribute it and/or modify  *
  22.  *   it under the terms of the GNU General Public License as published by  *
  23.  *   the Free Software Foundation; either version 2 of the License, or     *
  24.  *   (at your option) any later version.                                   *
  25.  *                                                                         *
  26.  ***************************************************************************/
  27.  
  28.  
  29. #define TITLE "\nTDMouse Version 1.10 - Copyright (C) 1997-2000 by Thomas Dreibholz"
  30.  
  31. struct IntuitionBase *IntuitionBase;
  32.  
  33. void SerRead();
  34. void MouseEvent();
  35. void HandleArgs();
  36. extern FLOAT atof();
  37.  
  38. #define BIT6 (1L<<6)
  39. #define BIT5 (1L<<5)
  40. #define BIT4 (1L<<4)
  41. #define BIT3 (1L<<3)
  42. #define BIT2 (1L<<2)
  43. #define BIT1 (1L<<1)
  44. #define BIT0 (1L<<0)
  45.  
  46. UBYTE           *TName="TDMouse 1.1, Copyright (C) 1997-2000 by Thomas Dreibholz";
  47. UBYTE           *Device="serial.device";
  48. UWORD            Unit=0;
  49. BOOL             Genius=TRUE;
  50. BOOL             MSystems=FALSE;
  51. BOOL             Share=TRUE;
  52. WORD             WriteDelay=2;
  53. WORD             TaskPri=127;
  54. FLOAT            ResX=2;
  55. FLOAT            ResY=2;
  56.  
  57. WORD             PosX=0;
  58. WORD             PosY=0;
  59. UWORD            Qualifier=0;
  60.  
  61. struct IOExtSer   *SerialIO;
  62. struct IOStdReq   *InputIO;
  63. struct MsgPort    *SerialPort,
  64.                   *InputPort,
  65.                   *ControlPort;
  66. struct InputEvent *Event;
  67. struct Task       *ThisTask;
  68. struct Interrupt  *EInterrupt;
  69. extern APTR        IntRoutine;
  70. LONG               SerialDev=-1L,
  71.                    InputDev=-1L;
  72. ULONG              ControlSignalMask;
  73. ULONG              SignalMask;
  74.  
  75. BYTE               Left=0,
  76.                    Right=0,
  77.                    Middle=0;
  78.  
  79. void CloseAll()
  80. {
  81.  if(ThisTask)
  82.   {
  83.    InputIO->io_Data=EInterrupt;
  84.    InputIO->io_Length=sizeof(struct Interrupt);
  85.    InputIO->io_Command=IND_REMHANDLER;
  86.    DoIO(InputIO);
  87.   }
  88.  if(SerialDev==0) CloseDevice(SerialIO);
  89.  if(SerialIO) DeleteExtIO(SerialIO);
  90.  if(SerialPort) DeletePort(SerialPort);
  91.  if(InputDev==0) CloseDevice(InputIO);
  92.  if(InputIO) DeleteExtIO(InputIO);
  93.  if(InputPort) DeletePort(InputPort);
  94.  if(ControlPort) DeletePort(ControlPort);
  95.  if(EInterrupt) FreeMem(EInterrupt,sizeof(struct Interrupt));
  96.  if(Event) FreeMem(Event,sizeof(struct InputEvent));
  97.  if(IntuitionBase) CloseLibrary(IntuitionBase);
  98.  exit(0);
  99. }
  100.  
  101. void OpenAll()
  102. {
  103.  register struct MsgPort *port;
  104.  register struct Message *msg;
  105.  UBYTE                    init;
  106.  
  107.  IntuitionBase=OpenLibrary("intuition.library",0L);
  108.  if(IntuitionBase==NULL)
  109.    CloseAll();
  110.  
  111.  port=FindPort(TName);
  112.  if(port!=NULL)
  113.   {
  114.    ControlPort=CreatePort(0L,0L);
  115.    if(ControlPort!=NULL)
  116.     {
  117.      msg=AllocMem(sizeof(struct Message),MEMF_CLEAR|MEMF_PUBLIC);
  118.      if(msg!=NULL)
  119.       {
  120.        msg->mn_Node.ln_Type=NT_MESSAGE;
  121.        msg->mn_ReplyPort=ControlPort;
  122.        PutMsg(port,msg);
  123.        puts("TDMouse removed.");
  124.        WaitPort(ControlPort);
  125.        FreeMem(msg,sizeof(struct Message));
  126.        CloseAll();
  127.       }
  128.     }
  129.   }
  130.  
  131.  SerialPort=CreatePort(0L,0L);
  132.  InputPort=CreatePort(0L,0L);
  133.  ControlPort=CreatePort(TName,0L);
  134.  if((SerialPort==NULL)||(InputPort==NULL)||(ControlPort==NULL))
  135.   { puts("ERROR: CreatePort()!");
  136.     CloseAll(); }
  137.  ControlSignalMask=(1L<<ControlPort->mp_SigBit);
  138.  SignalMask=ControlSignalMask+(1L<<SerialPort->mp_SigBit);
  139.  
  140.  SerialIO=CreateExtIO(SerialPort,sizeof(struct IOExtSer));
  141.  if(SerialIO==NULL)
  142.   { puts("ERROR: CreateExtIO()!");
  143.     CloseAll(); }
  144.  
  145.  InputIO=CreateExtIO(InputPort,sizeof(struct IOStdReq));
  146.  if(InputIO==NULL)
  147.   { puts("ERROR: CreateExtIO()!");
  148.     CloseAll(); }
  149.  
  150.  InputDev=OpenDevice("input.device",0,InputIO,0);
  151.  if(InputDev!=0)
  152.   {
  153.    puts("ERROR: Unable to open input.device!");
  154.    CloseAll();
  155.   }
  156.  
  157.  EInterrupt=AllocMem(sizeof(struct Interrupt),MEMF_CLEAR|MEMF_PUBLIC);
  158.  Event=AllocMem(sizeof(struct InputEvent),MEMF_CLEAR|MEMF_PUBLIC);
  159.  if((EInterrupt==NULL)||(Event==NULL))
  160.   { puts("ERROR: Out of memory!");
  161.     CloseAll(); }
  162.  
  163.  SerialIO->io_SerFlags=SERF_XDISABLED;
  164.  if(Share) SerialIO->io_SerFlags+=SERF_SHARED;
  165.  SerialDev=OpenDevice(Device,Unit,SerialIO,0);
  166.  if(SerialDev!=0)
  167.   {
  168.    printf("ERROR: Unable to open %s, unit %d! OpenDevice() error #%ld\n",
  169.           Device,Unit,SerialDev);
  170.    CloseAll();
  171.   }
  172.  
  173.  SerialIO->io_StopBits=1;
  174.  SerialIO->io_ReadLen=7;
  175.  SerialIO->io_WriteLen=7;
  176.  SerialIO->io_Baud=1200;
  177.  SerialIO->io_RBufLen=512;
  178.  SerialIO->IOSer.io_Command=SDCMD_SETPARAMS;
  179.  DoIO(SerialIO);
  180.  
  181.  if(Genius)
  182.   {
  183.    SerRead(&init);
  184.    SerRead(&init);
  185.    if(init==76)
  186.     {
  187.      puts("TDMouse: MouseSystems Mode");
  188.      MSystems=TRUE;
  189.      SerialIO->io_ReadLen=8;
  190.      SerialIO->io_WriteLen=8;
  191.      SerialIO->IOSer.io_Command=SDCMD_SETPARAMS;
  192.      DoIO(SerialIO);
  193.     }
  194.    else if(init==79)
  195.     {
  196.      puts("TDMouse: Microsoft Mode");
  197.     }
  198.    else
  199.     {
  200.      puts("TDMouse: Mouse not found/No MouseSystems mouse!");
  201.      printf("MouseID = %ld\n",init);
  202.      puts("TDMouse not installed!");
  203.      CloseAll();
  204.     }
  205.   }
  206.  
  207.  EInterrupt->is_Code=&IntRoutine;
  208.  EInterrupt->is_Node.ln_Type=NT_INTERRUPT;
  209.  EInterrupt->is_Node.ln_Name="tdmouse.interrupt";
  210.  EInterrupt->is_Node.ln_Pri=52;
  211.  InputIO->io_Data=EInterrupt;
  212.  InputIO->io_Length=sizeof(struct Interrupt);
  213.  InputIO->io_Command=IND_ADDHANDLER;
  214.  DoIO(InputIO);
  215.  
  216.  ThisTask=FindTask(NULL);
  217.  SetTaskPri(ThisTask,TaskPri);
  218.  
  219.  printf("hres     = %2.1f Mickeys/Pixel\n",ResX);
  220.  printf("vres     = %2.1f Mickeys/Pixel\n",ResY);
  221.  printf("delay    = %ld Mickeys\n",WriteDelay);
  222.  printf("priority = %ld\n",TaskPri);
  223. }
  224.  
  225. void SerRead(data)
  226.  UBYTE *data;
  227. {
  228.  REGISTER ULONG           Signale;
  229.  register struct Message *msg;
  230.  
  231.  SerialIO->IOSer.io_Data=data;
  232.  SerialIO->IOSer.io_Length=1L;
  233.  SerialIO->IOSer.io_Command=CMD_READ;
  234.  SendIO(SerialIO);
  235.  
  236.  Signale=Wait(SignalMask);
  237.  if(Signale & ControlSignalMask)
  238.   {
  239.    msg=GetMsg(ControlPort);
  240.    if(msg!=NULL)
  241.     {
  242.      ReplyMsg(msg);
  243.      AbortIO(SerialIO);
  244.      CloseAll();
  245.     }
  246.   }
  247. }
  248.  
  249.  
  250. void main(argc,argv)
  251.  int    argc;
  252.  UBYTE *argv[];
  253. {
  254.  WORD  x,y,l,r,m;
  255.  UBYTE byte;
  256.  BYTE  b1,b2,b3,b4;
  257.  
  258.  HandleArgs(argc,argv);
  259.  OpenAll();
  260.  
  261. start:
  262.  if(MSystems)
  263.   {
  264.    for(;;)
  265.     {
  266.      SerRead(&byte);
  267.      if((byte & 0xf8)==0x80)
  268.       {
  269.        l=r=m=0;
  270.        SerRead(&b1);
  271.        SerRead(&b2);
  272.        SerRead(&b3);
  273.        SerRead(&b4);
  274.        x=b1+b3;
  275.        y=-(b2+b4);
  276.        byte=(~byte) & 0x07;
  277.        if(byte & BIT0) r=1;
  278.        if(byte & BIT1) m=2;
  279.        if(byte & BIT2) l=4;
  280.        MouseEvent(x,y,l,r,m);
  281.       }
  282.      else if(byte==207)
  283.       {
  284.        SerRead(&byte);
  285.        if(byte==207)
  286.          SerRead(&byte);
  287.          if(byte==207)
  288.            SerRead(&byte);
  289.            if(byte==207)
  290.              SerRead(&byte);
  291.              if(byte==207)
  292.               {
  293.                MSystems=FALSE;
  294.                SerialIO->io_ReadLen=7;
  295.                SerialIO->io_WriteLen=7;
  296.                SerialIO->IOSer.io_Command=SDCMD_SETPARAMS;
  297.                DoIO(SerialIO);
  298.                goto start;
  299.               }
  300.       }
  301.     }
  302.   }
  303.  else
  304.   {
  305.    for(;;)
  306.     {
  307.      SerRead(&byte);
  308.  
  309.      if(byte & BIT6)
  310.       {
  311.        l=r=m=0;
  312.        SerRead(&b1);
  313.        if(!(b1 & BIT6))
  314.         {
  315.          SerRead(&b2);
  316.          if(!(b2 & BIT6))
  317.           {
  318.            if(byte & BIT5) l=1;
  319.            if(byte & BIT4) r=1;
  320.  
  321.            x=b1;
  322.            y=b2;
  323.            if(byte & BIT0) x+=64;
  324.            if(byte & BIT1) x+=128;
  325.            if(byte & BIT2) y+=64;
  326.            if(byte & BIT3) y+=128;
  327.  
  328.            if(x>127) x=(256-x)*-1;
  329.            if(y>127) y=(256-y)*-1;
  330.  
  331.            MouseEvent(x,y,l,r,m);
  332.           }
  333.         }
  334.        else
  335.         {
  336.          SerRead(&b2);
  337.          if((byte==76) && (b1==76) && (b2==76))
  338.           {
  339.            MSystems=TRUE;
  340.            SerialIO->io_ReadLen=8;
  341.            SerialIO->io_WriteLen=8;
  342.            SerialIO->IOSer.io_Command=SDCMD_SETPARAMS;
  343.            DoIO(SerialIO);
  344.            goto start;
  345.           }
  346.         }
  347.       }
  348.     }
  349.   }
  350.  
  351.  CloseAll();
  352. }
  353.  
  354. void HandleArgs(argc,argv)
  355.  int    argc;
  356.  UBYTE *argv[];
  357. {
  358.  register int i;
  359.  
  360.  puts(TITLE);
  361.  if((argc>=1)&&(!(strcmp(argv[1],"?"))))
  362.   {
  363.    puts("\nUsage: TDMouse");
  364.    puts("        {DEVICE=device name}");
  365.    puts("        {UNIT=unit number}");
  366.    puts("        {GENIUS|NOGENIUS}");
  367.    puts("        {PORTSHARE|NOPORTSHARE}");
  368.    puts("        {RX=n}  0.2<n<64");
  369.    puts("        {RY=n}  0.2<n<64");
  370.    puts("        {TASKPRI=n}  -128<=n<=127");
  371.    puts("        {EVDELAY=n}  0<=n<64");
  372.    puts("\nSee TDMouse.txt for details.\n");
  373.    exit(0);
  374.   }
  375.  for(i=1;i<argc;i++)
  376.   {
  377.    if(!(strcmp(argv[i],"GENIUS")))           Genius=TRUE;
  378.    else if(!(strcmp(argv[i],"NOGENIUS")))    Genius=FALSE;
  379.    else if(!(strcmp(argv[i],"PORTSHARE")))   Share=TRUE;
  380.    else if(!(strcmp(argv[i],"NOPORTSHARE"))) Share=FALSE;
  381.    else if(!(strncmp(argv[i],"DEVICE=",7)))  Device=&argv[i][7];
  382.    else if(!(strncmp(argv[i],"UNIT=",5)))    Unit=atol(&argv[i][5]);
  383.    else if(!(strncmp(argv[i],"RX=",3)))
  384.     {
  385.      ResX=atof((ULONG)argv[i]+3L);
  386.      if(ResX<0.2) ResX=0.2;
  387.      if(ResX>63.0) ResX=63.0;
  388.     }
  389.    else if(!(strncmp(argv[i],"RY=",3)))
  390.     {
  391.      ResY=atof((ULONG)argv[i]+3L);
  392.      if(ResY<0.2) ResY=0.2;
  393.      if(ResY>63.0) ResY=63.0;
  394.     }
  395.    else if(!(strncmp(argv[i],"TASKPRI=",8)))
  396.     {
  397.      TaskPri=atol((ULONG)argv[i]+8L);
  398.      if(TaskPri<-128) TaskPri=-128;
  399.      if(TaskPri>127) TaskPri=127;
  400.     }
  401.    else if(!(strncmp(argv[i],"EVDELAY=",8)))
  402.     {
  403.      WriteDelay=atol((ULONG)argv[i]+8L);
  404.      if(WriteDelay<0) WriteDelay=0;
  405.      if(WriteDelay>63) WriteDelay=63;
  406.     }
  407.    else
  408.     {
  409.      printf("Unknown argument: %s\n",argv[i]);
  410.      exit(100);
  411.     }
  412.   }
  413. }
  414.  
  415. void MouseEvent(mx,my,l,r,m)
  416.  WORD mx,my;
  417.  BYTE l,r,m;
  418. {
  419.  PosX+=mx;
  420.  PosY+=my;
  421.  
  422.  if( ((PosX>WriteDelay) || (PosX<-WriteDelay)) ||
  423.      ((PosY>WriteDelay) || (PosY<-WriteDelay)) ||
  424.      ((Left!=l) || (Right!=r)) || (Middle!=m) )
  425.   {
  426.  
  427.    Event->ie_SubClass=0;
  428.    Event->ie_NextEvent=0;
  429.    Event->ie_Qualifier=Qualifier;
  430.    Event->ie_Qualifier |= IEQUALIFIER_RELATIVEMOUSE;
  431.  
  432.    if(l)
  433.      Event->ie_Qualifier |= IEQUALIFIER_LEFTBUTTON;
  434.    else
  435.      Event->ie_Qualifier &= (0xffff-IEQUALIFIER_LEFTBUTTON);
  436.  
  437.    if(r)
  438.      Event->ie_Qualifier |= IEQUALIFIER_RBUTTON;
  439.    else
  440.      Event->ie_Qualifier &= (0xffff-IEQUALIFIER_RBUTTON);
  441.  
  442.    if(m)
  443.      Event->ie_Qualifier |= IEQUALIFIER_MIDBUTTON;
  444.    else
  445.      Event->ie_Qualifier &= (0xffff-IEQUALIFIER_MIDBUTTON);
  446.  
  447.    if((PosX!=0) || (PosY!=0))
  448.     {
  449.      Event->ie_Class=IECLASS_RAWMOUSE;
  450.      Event->ie_X=PosX/(UWORD)ResX;
  451.      Event->ie_Y=PosY/(UWORD)ResY;
  452.      Event->ie_Code=IECODE_NOBUTTON;
  453.      InputIO->io_Data=Event;
  454.      InputIO->io_Length=sizeof(struct InputEvent);
  455.      InputIO->io_Flags=0;
  456.      InputIO->io_Command=IND_WRITEEVENT;
  457.      CurrentTime(&Event->ie_TimeStamp.tv_secs,&Event->ie_TimeStamp.tv_micro);
  458.      DoIO(InputIO);
  459.  
  460.      PosX=0;
  461.      PosY=0;
  462.     }
  463.    Event->ie_X=0;
  464.    Event->ie_Y=0;
  465.  
  466.    if(Left!=l)
  467.     {
  468.      Left=l;
  469.  
  470.      if(l)
  471.        Event->ie_Code=IECODE_LBUTTON;
  472.      else
  473.        Event->ie_Code=IECODE_LBUTTON|IECODE_UP_PREFIX;
  474.      CurrentTime(&Event->ie_TimeStamp.tv_secs,&Event->ie_TimeStamp.tv_micro);
  475.      DoIO(InputIO);
  476.     }
  477.  
  478.    if(Right!=r)
  479.     {
  480.      Right=r;
  481.  
  482.      if(r)
  483.        Event->ie_Code=IECODE_RBUTTON;
  484.      else
  485.        Event->ie_Code=IECODE_RBUTTON|IECODE_UP_PREFIX;
  486.      CurrentTime(&Event->ie_TimeStamp.tv_secs,&Event->ie_TimeStamp.tv_micro);
  487.      DoIO(InputIO);
  488.     }
  489.  
  490.    if(Middle!=m)
  491.     {
  492.      Middle=m;
  493.  
  494.      if(m)
  495.        Event->ie_Code=IECODE_MBUTTON;
  496.      else
  497.        Event->ie_Code=IECODE_MBUTTON|IECODE_UP_PREFIX;
  498.      CurrentTime(&Event->ie_TimeStamp.tv_secs,&Event->ie_TimeStamp.tv_micro);
  499.      DoIO(InputIO);
  500.     }
  501.   }
  502. }
  503.  
  504. #asm
  505.    public _IntRoutine
  506.    public _geta4
  507. _IntRoutine:
  508.    movem.l a4,-(sp)
  509.    jsr _geta4
  510.    move.w 8(a0),_Qualifier
  511.    movem.l (sp)+,a4
  512.    rts
  513. #endasm
  514.